home *** CD-ROM | disk | FTP | other *** search
/ Floppyshop 2 / Floppyshop - 2.zip / Floppyshop - 2.iso / art&graf.ix / art-0015 / flicker / findcol.c < prev    next >
C/C++ Source or Header  |  1997-04-16  |  2KB  |  106 lines

  1.  
  2. #include <osbind.h>
  3. #include "flicker.h"
  4.  
  5. WORD sys_cmap[16] = { 
  6.     0x000,    0x004,    0x007,    0x407,
  7.     0x707,    0x704,    0x700,    0x740,
  8.     0x770,    0x470,    0x070,    0x074,
  9.     0x077,    0x047,    0x444,    0x777,
  10.     };
  11. char oppositec[16];        /* worst fit lookup - for visible cursor */
  12.  
  13. put_cmap(cmap)
  14. WORD *cmap;
  15. {
  16. Setpallete(cmap);
  17. copy_words(cmap, sys_cmap, 16);
  18. make_oppositec();
  19. }
  20.  
  21. WORD white, black, red;
  22.  
  23. color_dif(c1, c2)
  24. register WORD c1, c2;
  25. {
  26. register WORD temp, acc;
  27.  
  28. temp = (c1&7) - (c2&7);
  29. acc = temp*temp;
  30. temp = ((c1>>4)&7) - ((c2>>4)&7);
  31. acc += temp*temp;
  32. temp = (c1>>8) - (c2>>8);
  33. acc += temp*temp;
  34. return(acc);
  35. }
  36.  
  37. closest_col(abs, start_ix)
  38. WORD abs;    /* absolute color */
  39. WORD start_ix;
  40. {
  41. register WORD min_dif;
  42. register WORD temp;
  43. WORD i;
  44. register WORD *pt;
  45. WORD closest;
  46.  
  47. pt = sys_cmap + start_ix;
  48. min_dif = color_dif(abs, *pt++);
  49. closest = start_ix;
  50. for (i=start_ix+1; i<16; i++)
  51.     {
  52.     temp = color_dif(abs, *pt++);
  53.     if (temp < min_dif)
  54.         {
  55.         closest = i;
  56.         min_dif = temp;
  57.         }
  58.     }
  59. return(closest);
  60. }
  61.  
  62. opposite_color(col)
  63. WORD col;
  64. {
  65. register WORD abs;
  66. register WORD max_dif;    
  67. register WORD temp;
  68. WORD i;
  69. register WORD *pt;
  70. WORD farthest;
  71.  
  72. pt = sys_cmap;
  73. abs = pt[col];
  74. max_dif = color_dif(abs, *pt++);
  75. farthest = 0;
  76. for (i=1; i<16; i++)
  77.     {
  78.     temp = color_dif(abs, *pt++);
  79.     if (temp > max_dif)
  80.         {
  81.         farthest = i;
  82.         max_dif = temp;
  83.         }
  84.     }
  85. return(farthest);
  86. }
  87.  
  88.  
  89. find_colors()
  90. {
  91. white = closest_col(0x777, 0);
  92. black = closest_col(0x000, 0);
  93. red = closest_col(0x700, 0);
  94. }
  95.  
  96. make_oppositec()
  97. {
  98. register char *cc;
  99. register WORD i;
  100.  
  101. cc = oppositec;
  102. for (i=0; i<16; i++)
  103.     *cc++ = opposite_color(i);
  104. }
  105.  
  106.